﻿// mcang_server.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include "mongoose.h"
#include <fstream>
#include <sstream>
#include <string>
#include <vector>
#include <iostream>
#include <sys/stat.h> // 替代std::filesystem以提高兼容性
#include "image_request.h"
#include "text_request.h"
#include "home_request.h"

const std::string cert_file = "C:\\Users\\89436\\Desktop\\www.maxiaocang.xyz_public.crt";
const std::string key_file = "C:\\Users\\89436\\Desktop\\www.maxiaocang.xyz.key";

bool fileExists(const std::string& filename) {
    std::ifstream file(filename);
    return file.good();
}

// 事件处理函数
static void ev_handler(struct mg_connection* c, int ev, void* ev_data) {
    if (ev == MG_EV_HTTP_MSG) {
        struct mg_http_message* hm = (struct mg_http_message*)ev_data;
        std::string uri(hm->uri.buf, hm->uri.len);

        // 只处理/images/开头的请求
        if (uri.substr(0, 8) == "/images/") {

			handle_image_request(uri, c, hm);
        }
        else if (uri.substr(0, 6) == "/file/") {
           
            handle_text_request(uri, c, hm);
        }
        else if (uri == "/" || uri.empty()) {
        
            handle_home_request(uri, c, hm);
        }
        else {
            // 其他未知路径返回404
            mg_http_reply(c, 404, "Content-Type: text/plain\r\n",
                "Page not found");
        }

    } else if (ev == MG_EV_ERROR) {
        // 处理错误事件
        MG_ERROR(("Server error: %s", (char*)ev_data));
    }
	else {

    }

}

// 测试图片: http://localhost:8080/images/1755747177/1.png
// 测试文本: http://localhost:8080/file/mcang_data.txt

int main() {
    struct mg_mgr mgr;
    const char* s_listening_url = "http://0.0.0.0:8080";

    // 初始化Mongoose
    mg_mgr_init(&mgr);
    printf("Starting image server on port %s\n", s_listening_url);
    printf("Images root directory: %s\n", IMAGE_ROOT.c_str());
    printf("Access images via: http://localhost:%s/images/[filename]\n", s_listening_url);
    /**
    // 设置SSL证书和私钥
    if (!fileExists(cert_file)) {
        std::cerr << "错误: 证书文件不存在: " << cert_file << std::endl;
    }

    if (!fileExists(key_file)) {
        std::cerr << "错误: 私钥文件不存在: " << key_file << std::endl;
    }

    mg_tls_opts opts;
    memset(&opts, 0, sizeof(opts));
    opts.cert = mg_unpacked(cert_file.c_str()); // SSL证书文件路径
    opts.key = mg_unpacked(key_file.c_str());   // 私钥文件路径
    */
    struct mg_connection* c = mg_http_listen(&mgr, s_listening_url, ev_handler, NULL);
    if (c == NULL) {
        fprintf(stderr, "Failed to start server on port %s\n", s_listening_url);
        return 1;
    } 

    // 事件循环
    for (;;) {
        mg_mgr_poll(&mgr, 1000); // 1秒超时
    }

    // 清理
    mg_mgr_free(&mgr);
    return 0;
}


// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单

// 入门使用技巧: 
//   1. 使用解决方案资源管理器窗口添加/管理文件
//   2. 使用团队资源管理器窗口连接到源代码管理
//   3. 使用输出窗口查看生成输出和其他消息
//   4. 使用错误列表窗口查看错误
//   5. 转到“项目”>“添加新项”以创建新的代码文件，或转到“项目”>“添加现有项”以将现有代码文件添加到项目
//   6. 将来，若要再次打开此项目，请转到“文件”>“打开”>“项目”并选择 .sln 文件
